IoT センサーデータを AWS IoT Core 経由で SiteWise に送ってみた
AWS IoT SiteWise では API や SiteWise ゲートウェイの他に、IoT Core 経由でデータを書き込む事もできます。今回はその方法を紹介したいと思います。
構成
構成は単純です。IoT Core で受け取ったデータを 専用のルールアクションを使って SiteWise に転送します。
作業の流れ
- クライアントプログラムの作成
- IAM 権限の設定
- IoT Core の設定
- ルールの作成
- SiteWise の設定
- アセットモデル、アセットの作成
- アセットプロパティとデータストリームの関連付け
クライアントプログラムの作成
今回も擬似デバイス用のプログラムを用意します。疑似デバイスが送るデータの内容は下記のとおりです。
- 温度
- プロパティエイリアス:
/MyDevice/1/Temperature
- プロパティエイリアス:
- 湿度
- プロパティエイリアス:
/MyDevice/1/Humidity
- プロパティエイリアス:
コードは下記になります。( sitewise-send-data-http.py
というファイル名で保存)
19 行目の endpoint_url
はご利用の環境のものに修正して下さい。
import boto3 import json import logging import random import sys import time import uuid import math logger = logging.getLogger() logger.setLevel(logging.INFO) streamHandler = logging.StreamHandler(stream=sys.stdout) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') streamHandler.setFormatter(formatter) logger.addHandler(streamHandler) client = boto3.client('iot-data', endpoint_url='https://xxxxxx-ats.iot.ap-northeast-1.amazonaws.com') topic = 'sitewise/ingest' def mqtt_pub_asset(): start = time.time() while True: timestamp_float, timestamp_int = math.modf(time.time()) MeasureValueTemp = random.uniform(20, 50) MeasureValueHumi = random.uniform(40, 80) logger.info("temperature: {}".format(MeasureValueTemp)) logger.info("humidity: {}".format(MeasureValueHumi)) try: entries=[ { 'entryId': '{}'.format(uuid.uuid4()), 'propertyAlias': '/MyDevice/1/Temperature', 'value': MeasureValueTemp, 'timeInSeconds': int(timestamp_int), 'offsetInNanos': int(round((timestamp_float * 1000000000), 0)), 'quality': 'GOOD' }, { 'entryId': '{}'.format(uuid.uuid4()), 'propertyAlias': '/MyDevice/1/Humidity', 'value': MeasureValueHumi, 'timeInSeconds': int(timestamp_int), 'offsetInNanos': int(round((timestamp_float * 1000000000), 0)), 'quality': 'GOOD' } ] for e in entries: response = client.publish( topic=topic, qos=0, payload=json.dumps(e) ) logger.info("response: {}\n".format(json.dumps(response, indent=2))) except Exception as e: logger.error("{}".format(e)) logger.error("temperture: {} humidity: {}".format(MeasureValueTemp, MeasureValueHumi)) time.sleep(5) try: mqtt_pub_asset() except KeyboardInterrupt: print('\nstopped putting value.')
コードにあるとおり、IoT Core へパブリッシュされるデータは下記のような内容になります。
{ "entryId": "99efc234-117c-4b0b-b04b-1a726b94c1bb", "propertyAlias": "/MyDevice/1/Humidity", "value": 75.03000095999147, "timeInSeconds": 1649183630, "offsetInNanos": 883272886, "quality": "GOOD" }
IAM 権限の設定
次に IoT Coreのルールで利用する IAM Role を下記の通り作成します。
権限は緩いので本番で利用する場合はさらに権限を絞るようにして下さい。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iotsitewise:BatchPutAssetPropertyValue", "Resource": "*" } ] }
信頼関係は次のとおりです。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "iot.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
IoT Core の設定
次に IoT Core で受け取ったデータを SiteWise に転送するルールを作成します。
適当なルール名をつけて下記のようなクエリをセットします。
SELECT entryId, propertyAlias, value, timeInSeconds, offsetInNanos, quality FROM 'sitewise/ingest'
次に「アクションの追加」をクリックします。
アクションの一覧から「AWS IoT SiteWise」を選択します。
「アクションの設定」画面では下記の通り設定します。
propertyAlias
や timeInSeconds
などいずれも IoT Core にパブリッシュされるデータ項目に存在するので、それらをマッピングする形で設定します。
最後に先程作成した IAM Role (test-mqtt-sitewise-rule
)を選択して「アクションの追加」をクリックして完了です。
SiteWise の設定
次に SiteWise 側でアセットモデルとアセットを作成します。
適当なモデル名をつけて下さい。
「測定の定義」には送られてくるデータに合わせて humidity
と temperature
の 2 つをダブル型で定義します。
次にアセットを作成します。
先程作成したモデル mqtt-publish-test
を指定して作成します。
名前は適当なものを付けて下さい。今回は mqtt-device-1
としました。
アセットプロパティとデータストリームの関連付け
ここまで設定できたら先程のスクリプトを実行して、IoT Core へのデータ送信を開始します。
$ python sitewise-send-data-http.py
なお、スクリプトを実行する環境(パソコンや EC2 など)では必要な権限を追加して実行して下さい。今回は AWS 管理ポリシーである AWSIoTDataAccess
を利用しました。
データが正常に IoT Core 経由で SiteWise に届いていれば、下記のように SiteWise のデータストリームにエイリアスが出現しているはずなので、データストリームエイリアスとアセットプロパティの関連付けを行います。
前回と同じ要領でデータストリームエイリアスとアセットプロパティの関連付けを行います。
ここまでの作業が正常に完了していれば、アセット mqtt-device-1
の画面でデータが届いていることが確認できると思います。
SiteWise までデータが届けば SiteWise Monitor でのデータの可視化は同じ手順で実現可能です。
具体的な手順については下記を参考にして下さい。
最後に
AWS IoT Core 経由でデータを送ってみましたが「IoT Coreのルールアクションの設定」が今回のポイントになります。その他の部分はこれまで紹介した SiteWise の記事の内容とほとんど変わりません。
(ちなみにコードを見ていただければ分かりますが、今回は 横着をしてデバイス証明書を使わずにデータを送っています。デバイス証明書を使って MQTT で送る場合でも手順は同じになります。)
さて、これまでに 3 つの方法で SiteWise にデータ書込みを行いましたが、製造業データでも一般的なセンサーデータでも SiteWise を利用して簡単に可視化できることが分かりました。
- SiteWise ゲートウェイ経由で OPC UAプロトコルでデータ書き込み
- SiteWise API でデータ書込み
- IoT Core 経由でデータ書込み
これからガンガン活用していきたいと思います。